package LimitedTimeGame.Day_0201;

/**
 * @author zxc
 * @date 2023/02/01 12:15
 **/

import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Set;

/**
 * 题目 ：解密消息
 * 题目详述 ：
 * 给你字符串 key 和 message ，分别表示一个加密密钥和一段加密消息。解密 message 的步骤如下：

 * 使用 key 中 26 个英文小写字母第一次出现的顺序作为替换表中的字母 顺序 。
 * 将替换表与普通英文字母表对齐，形成对照表。
 * 按照对照表 替换 message 中的每个字母。
 * 空格 ' ' 保持不变。
 * 例如，key = "happy boy"（实际的加密密钥会包含字母表中每个字母 至少一次），
 * 据此，可以得到部分对照表（'h' -> 'a'、'a' -> 'b'、'p' -> 'c'、'y' -> 'd'、'b' -> 'e'、'o' -> 'f'）。
 * 返回解密后的消息。
 *
 * 提示：
 *
 * 26 <= key.length <= 2000
 * key 由小写英文字母及 ' ' 组成
 * key 包含英文字母表中每个字符（'a' 到 'z'）至少一次
 * 1 <= message.length <= 2000
 * message 由小写英文字母和 ' ' 组成
 *
 */
public class DecodeMessage {
    public String decodeMessage(String key, String message) {
        // 由于 使用key中26个英文小写字母第一次出现的顺序 去替换普通英文字母表顺序;
        // ===》 即，hashmap永安里存储 key中字母顺序与普通英文字母表中字母顺序之间的映射关系;
        HashMap<Character , Character> hashMap = new HashMap<>();
        // Set集合，遍历key中所有字母，判断某个字母是否已经重复出现过;
        Set<Character> set = new HashSet<>();

        char[] keyArr = key.toCharArray();
        char k = 'a';
        // 遍历加密密钥key，获取key和普通字母表之间的字母映射关系;
        for (char ch : keyArr) {
            // 若是key中正在遍历的字母ch第一次出现 && ch != ' '，即将 其之间的映射关系存储到hashmap和set中;
            if(!set.contains(ch) && ch != ' '){
                System.out.println(k + " ===> " + ch);
                set.add(ch);
                hashMap.put(ch , k);
                k++;
            }
            // 循环结束条件 ：即，当和普通字母表中所有字母建立映射关系后，直接退出循环即可;
            if(k == 'z' + 1){
                break;
            }
        }
        // 对于所要解密的消息message进行解密;
        char[] messageArr = message.toCharArray();
        // 即，将字符串message转换为char[]数组，便于遍历字符 && 便于修改字符;
        for (int i = 0 ; i < message.length() ; i++) {
            // 若是所要解密的消息message中正在遍历的字母 != ' ',
            // ===> 即，将message中正在遍历的字母替换成hashmap中映射关系对应的字母ch;
            if(messageArr[i] != ' '){
                Character value = hashMap.get(messageArr[i]);
                messageArr[i] = value;
            }
        }
        // 最后将字符数组转化为String类型，进行返回;
        return new String(messageArr);
    }
}
